home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / keysta / keystate.bas < prev    next >
BASIC Source File  |  1995-01-22  |  4KB  |  109 lines

  1. ' KeyState.Bas - Get or Set Caps Lock or Num Lock with an API
  2. ' 95/01/22 Adapted by Larry Rebich, The Bridge, Inc., CIS 71662,205
  3. '
  4. ' According to the following article KeyStat.VBX can cause a GPF under the
  5. ' described conditions.  I have been using KeyStat to set the status of the
  6. ' caps and num lock on the status bar of an application I am developing.
  7. ' I adapted the concepts provided by the "workaround" to not only test the
  8. ' key state but to toggle it as well.
  9. '
  10. ' I am sharing this code in hopes that if you develop useful code you will
  11. ' share it with others - including me!!!
  12. '
  13. ' Cheers,
  14. ' Larry
  15. '
  16.     Option Explicit
  17.     DefInt A-Z
  18.  
  19.     Declare Sub SetKeyboardState Lib "User" (ByVal lpKeyState As String)    'added by Larry Rebich
  20.     Declare Sub GetKeyboardState Lib "User" (ByVal lpKeyState As String)
  21.     Global Const VK_Capital = &H14      'pointer to location in string of caps info
  22.     Global Const VK_NumLock = &H90      'pointer to location in string of num lock info
  23.     Dim Keys As String * 256            'key values are retrieved into here
  24.     Const BitOne = &H1
  25.  
  26. ' ------------------  from the Microsoft Developers CD, volume 10 -------------
  27. 'PSS ID Number: Q121681
  28. 'Article last modified on 10-18-1994
  29. '
  30. '3.00
  31. '
  32. 'WINDOWS
  33. '
  34. '---------------------------------------------------------------------
  35. 'The information in this article applies to:
  36. '
  37. '- Professional Edition of Microsoft Visual Basic for Windows,
  38. '  version 3.0
  39. '---------------------------------------------------------------------
  40. '
  41. 'SYMPTOMS
  42. '========
  43. '
  44. 'When the KEYSTAT.VBX control is used in more than one application, and the
  45. 'parent window is minimized, the application causes a general protection
  46. '(GP) fault.
  47. '
  48. 'STATUS
  49. '======
  50. '
  51. 'Microsoft has confirmed this to be a bug in the Microsoft product listed
  52. 'at the beginning of this article. We are researching this problem and will
  53. 'post new information here in the Microsoft Knowledge Base as it becomes
  54. 'available.
  55. '
  56. 'WORKAROUND
  57. '==========
  58.  
  59. 'To work around this problem, use the Windows API GetKeyboardState function
  60. 'directly as in the following example:
  61. '
  62. '1. Start a new project in Visual Basic. Form1 is created by default.
  63. ''
  64. '2. Add the following code to the (general) (declarations) section
  65. '
  66. '    Declare Sub GetKeyboardState Lib "User" (ByVal lpKeyState As String)
  67. '    Global Const VK_Capital = &H14
  68. '    Global Const VK_NumLock = &H90
  69. '
  70. '3. Place a command button (Command1) on Form1, and add the following code
  71. '   to the Command1 Click event:
  72. '
  73. '4. Run the application.
  74. '
  75. 'Additional reference words: 3.00 buglist3.00 gpf
  76. 'KBCategory: kbprg kbbuglist kbcode
  77. 'KBSubcategory: PrgCtrlsCus
  78. '
  79. '=============================================================================
  80. '
  81. 'Copyright Microsoft Corporation 1994.
  82.  
  83. Function GetKeyboardStateCapsLock () As String
  84.     GetKeyboardState Keys           'API to get current state
  85.     If BitOne = (Asc(Mid(Keys, VK_Capital + 1, 1)) And BitOne) Then
  86.         GetKeyboardStateCapsLock = "Caps"
  87.     End If
  88. End Function
  89.  
  90. Function GetKeyboardStateNumLock () As String
  91.     GetKeyboardState Keys           'API to get current state
  92.     If BitOne = (Asc(Mid(Keys, VK_NumLock + 1, 1)) And BitOne) Then
  93.         GetKeyboardStateNumLock = "Num"
  94.     End If
  95. End Function
  96.  
  97. Sub SetKeyboardStateCapsLock ()
  98.     GetKeyboardState Keys       'get current setting
  99.     ' toggle it
  100.     SetKeyboardState Mid$(Keys, 1, VK_Capital) & Chr$(Asc(Mid$(Keys, VK_Capital + 1, 1)) Xor BitOne) & Mid$(Keys, VK_Capital + 2)
  101. End Sub
  102.  
  103. Sub SetKeyboardStateNumLock ()
  104.     GetKeyboardState Keys       'get current setting
  105.     ' toggle it
  106.     SetKeyboardState Mid$(Keys, 1, VK_NumLock) & Chr$(Asc(Mid$(Keys, VK_NumLock + 1, 1)) Xor BitOne) & Mid$(Keys, VK_NumLock + 2)
  107. End Sub
  108.  
  109.